﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using GMAC.ReportingSystem.Business.Entities;
using GMAC.ReportingSystem.Commom;
using System.Globalization;

namespace GMAC.ReportingSystem.Paginas
{
    //--------------------------------------------------------------
    /// <summary>
    /// Ricardo Recaredo (28/03/2011)
    /// </summary>
    //--------------------------------------------------------------

    public partial class CallReasonsByAgent : System.Web.UI.Page
    {
        #region Attributes

        // Indica cuando se está recargando la página para poder generar dinamicamente en el PreInit las columnas del Gridview
        // Cuando esto ocurre, no se deben ejecutar ciertas actividades en los eventos asociados a los botones que activaron el PostBack.

        bool flag =  false;

        #endregion

        ////////////////////////////////////////////////////////////////////////////////////

        protected void Page_PreInit(object sender, EventArgs e)
        {
            // Si es una recarga para generar las columnas dinámicas del GrdiView
            // se activa una bandera para evitar que se ejecuten cieras acciones del
            // evento asociado al botón que inició el PostBack

            if (Session["PostBack"] != null)
            {
                GenerateColumns((CallReasonByAgentCollection)Session["callReasonsByAgentCollection"], (int)Session["numAgents"]);

                flag = true;
            }
        }

        //--------------------------------------------------------------------------------

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!User.Identity.IsAuthenticated || Session["User"] == null)
            {
                System.Web.Security.FormsAuthentication.RedirectToLoginPage();
                return;
            }

            // Si es un postback o es un postback inducido por un Server.Transfer para obligar a generar las 
            // columnas dinámicas del GridView.

            if ((IsPostBack) || (Session["PostBack"] != null))
            {
                btnSave.Visible = true;

                Session["PostBack"] = null;

                return;
            }

            Initialize();

            ValidateSecurity();
        }

        ////////////////////////////////////////////////////////////////////////////////////

        #region Private Methods

        private DataTable GenerateDataTablePrueba()
        {
            DataTable dt = new DataTable();

            dt.Columns.Add("CallReason", typeof(string));
            dt.Columns.Add("Date", typeof(string));
            dt.Columns.Add("Agent1", typeof(string));
            dt.Columns.Add("Agent2", typeof(string));
            dt.Columns.Add("ID", typeof(string));

            DataRow rowdt;

            rowdt = dt.NewRow();
            rowdt[0] = "Motivo";
            rowdt[1] = "03/03/2011";
            rowdt[2] = "20";
            rowdt[3] = "0";
            rowdt[4] = "1";

            dt.Rows.Add(rowdt);

            return dt;

        }

        //--------------------------------------------------------------------------------

        private void ValidateSecurity()
        {
            var beEntities = ((User)Session["User"]).Role.Security.GetEntitySecurity("CallReasonByAgent");
            
            if (beEntities == null) return;
            
            if (!beEntities.CanRead)
            {
                panelContainer.Visible = false;
            }
            if ((!beEntities.CanWrite) || (!beEntities.CanInsert))
            {
                btnSave.Visible = false;
            }
        }
        
        //--------------------------------------------------------------------------------
        
        private void Initialize()
        {
            try
            {
                btnSave.Visible = false;
                imgCollapseSearch.Focus();
                GMAC.ReportingSystem.Business.Components.ProductComponent productController = new GMAC.ReportingSystem.Business.Components.ProductComponent();

                ddlProductType.DataSource     = productController.GetList();
                ddlProductType.DataValueField = "AccountTypeID";
                ddlProductType.DataTextField  = "Description";
                ddlProductType.DataBind();

                ddlProductType.Items.Insert(0,new ListItem("Select..",string.Empty));
            }
            catch (Exception ex)
            {
                FrameworkManapro.ErrorHandling.LoggingError.PostErrorEventViewer(ex.Message, "Initialize page", "Initialize", System.Diagnostics.TraceEventType.Error, ex.StackTrace);
                wucMessage.ShowMessage(UserControls.MessageType.Error, "An error occurred initializing the page.", ex.ToString());
                popupExtenderMessage.Show();
            }

        }

        //--------------------------------------------------------------------------------
        /// <summary>
        /// Ricardo Recaredo (28/03/2011)
        /// 
        /// Agrega al Gridview dinamicamente las columnas asociadas a las razones de llamada y a cada uno de los agentes.
        /// </summary>
        /// <param name="callReasonsByAgentCollection">Colección con todas las combinaciones Agente/Razón de número de llamadas para una fecha</param>
        /// <param name="numAgents">Número de Agentes existentes en sistema</param>
        //--------------------------------------------------------------------------------

        private void GenerateColumns(CallReasonByAgentCollection callReasonsByAgentCollection, int numAgents)
        {
            this.grvResults.Columns.Clear();

            BoundField reasonColumn = new BoundField();

            reasonColumn.HeaderText                  = "Call Reason";
            reasonColumn.DataField                   = "CallDate";
            reasonColumn.HeaderStyle.HorizontalAlign = HorizontalAlign.Center;
            reasonColumn.ItemStyle.HorizontalAlign   = HorizontalAlign.Left;

            grvResults.Columns.Add(reasonColumn);

            if (callReasonsByAgentCollection.Count > 0)
            {
                for (int i = 0; i < numAgents; i++)
                {
                    TemplateField agentColumn = new TemplateField();

                    agentColumn.HeaderText = callReasonsByAgentCollection.ElementAt(i).Agent.FirstName + " " + callReasonsByAgentCollection.ElementAt(i).Agent.LastName;
                    agentColumn.ItemTemplate = new CallReasonAgentTemplate("NumberOfCalls", "tbNumberOfCalls_" + callReasonsByAgentCollection.ElementAt(i).Agent.ID.ToString());
                    agentColumn.HeaderStyle.HorizontalAlign = HorizontalAlign.Center;
                    agentColumn.ItemStyle.HorizontalAlign = HorizontalAlign.Center;
                    grvResults.Columns.Add(agentColumn);
                }
            }

            grvResults.Width = new Unit((numAgents * 52) + 400);
        }

        //--------------------------------------------------------------------------------
        /// <summary>
        /// Ricardo Recaredo (28/03/2011)
        /// </summary>
        //--------------------------------------------------------------------------------
        
        private void PopulateCallReasonsByAgentGridView()
        {
            //Se crea una coleccion vacia de Razones de llamada con el número total de razones en base de datos.

            List<CallReasonByAgent> dataSource = new List<CallReasonByAgent>();

            for (int i = 0; i < (int)Session["numReasons"]; i++)
            {
                dataSource.Add(new CallReasonByAgent());
            }

            grvResults.DataSource = dataSource;

            grvResults.DataBind();

            if (grvResults.Rows.Count <= 0)
            {
                btnSave.Visible = false;
            }
            else
            {
                btnSave.Visible = true;
            }
        }

        #endregion

        ////////////////////////////////////////////////////////////////////////////////////

        #region Other Events

        protected void grvResults_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                int rowNumber    = e.Row.RowIndex;

                int startPos = (rowNumber * (int)Session["numAgents"]);
                int endPos   = (rowNumber * (int)Session["numAgents"]) + (int)Session["numAgents"];

                e.Row.Cells[0].Text = ((CallReasonByAgentCollection)Session["callReasonsByAgentCollection"]).ElementAt(startPos).CallReason.Description;

                for (int i = startPos; i < endPos; i++)
                {
                    ((TextBox)e.Row.FindControl("tbNumberOfCalls_" + ((CallReasonByAgentCollection)Session["callReasonsByAgentCollection"]).ElementAt(i).Agent.ID.ToString())).Text = ((CallReasonByAgentCollection)Session["callReasonsByAgentCollection"]).ElementAt(i).NumberOfCalls.ToString(); ;
                }
            }
        }

        //--------------------------------------------------------------------------------

        protected void grvResults_RowCommand(object sender, GridViewCommandEventArgs e)
        {
        }

        #endregion

        ////////////////////////////////////////////////////////////////////////////////////

        #region Button Events

        protected void imgBuscarReg_Click(object sender, ImageClickEventArgs e)
        {
            // Si aún no se han cargado en el ViewState las columnas dinámicas del GridView, se guardan en sesión, la colección de callReasonAgents
            // y el número de agentes. Se setea tabbién en sesión una bandera que le indica al PreInit que debe generar las columnas y que los datos
            // ya están en sesión, y se hace un Server.Transfer. (Server.Transfer con 2do parámetro en true reenvía el ViewState de la página actual).

            if (this.flag == false)
            {
                Business.Components.CallReasonByAgentComponent controller = new Business.Components.CallReasonByAgentComponent();

                int numReasons, numAgents;

                //Se obtiene una colección con todas las combinaciones CallReason/Agent y su correspondiente valor de llamadas realizadas para la fecha indicada.

                CallReasonByAgentCollection callReasonsByAgentCollection = controller.BuildFullCallReasonsByAgentMatrix(int.Parse(this.ddlProductType.SelectedValue), DateTime.Parse(this.txtDate.Text.ToString(), new CultureInfo("es-VE",false)), out numReasons, out numAgents);

                Session["numAgents"] = numAgents;
                Session["numReasons"] = numReasons;
                Session["callReasonsByAgentCollection"] = callReasonsByAgentCollection;

                Session.Add("PostBack", true);

                Server.Transfer(Request.Url.AbsolutePath.ToString(), true);
            }
            //Si ya se generaron las columnas dinámicas, se llena el GridView con la Data guardada en sesión.

            else
            {
                PopulateCallReasonsByAgentGridView();

                Session.Remove("PostBack");
            }
        }

        //--------------------------------------------------------------------------------

        protected void btnSave_Click(object sender, ImageClickEventArgs e)        
        {
            // Si aún no se han cargado en el ViewState las columnas dinámicas del GridView, se guardan en sesión, la colección de callReasonAgents
            // y el número de agentes. Se setea tabbién en sesión una bandera que le indica al PreInit que debe generar las columnas y que los datos
            // ya están en sesión, y se hace un Server.Transfer. (Server.Transfer con 2do parámetro en true reenvía el ViewState de la página actual).

            if (this.flag == false)
            {
                Session.Add("PostBack", true);

                Server.Transfer(Request.Url.AbsolutePath.ToString(), true);
            
            }
            else
            {
                if (grvResults.Rows.Count > 0)
                {
                    CallReasonByAgentCollection callReasonByAgentSavingCollection = new CallReasonByAgentCollection();

                    var numAgentes = (int)Session["numAgents"];

                    for (int i = 0; i < (grvResults.Rows.Count); i++)
                    {
                        for (int j = 1; j < grvResults.Columns.Count; j++)
                        {
                            var newCallNumberValue = int.Parse(((TextBox)grvResults.Rows[i].FindControl("tbNumberOfCalls_" + ((CallReasonByAgentCollection)Session["callReasonsByAgentCollection"]).ElementAt(j - 1).Agent.ID.ToString())).Text);
                            var oldCallNumberValue = ((CallReasonByAgentCollection)Session["callReasonsByAgentCollection"]).ElementAt((numAgentes * i) + (j - 1));

                            if (newCallNumberValue != oldCallNumberValue.NumberOfCalls)
                            {
                                CallReasonByAgent callReasonByAgentForSave = (CallReasonByAgent)oldCallNumberValue.Clone();

                                callReasonByAgentForSave.NumberOfCalls = newCallNumberValue;

                                callReasonByAgentSavingCollection.Add(callReasonByAgentForSave);
                            }
                        }
                    }

                    //---------------------------------

                    Business.Components.CallReasonByAgentComponent callReasonByAgentComponent = new Business.Components.CallReasonByAgentComponent();

                    if (callReasonByAgentSavingCollection.Count > 0)
                    {
                        callReasonByAgentComponent.LoadMultipleCallReasonsByAgent(callReasonByAgentSavingCollection, ((GMAC.ReportingSystem.Business.Entities.User)Session["User"]).UserID);

                        wucMessage.ShowMessage(UserControls.MessageType.Success, "Number of calls maded ​by agents successfully modified", null);

                        popupExtenderMessage.Show();
                    }
                }

                Session.Remove("PostBack");
            }
        }

        #endregion

    }
}
